// 导入依赖包
import koa from "koa";
// 导入 服务器端口
import { appPort } from "./config/appSetting.js";
// 导入 路由依赖包
import Router from "koa-router";
// 导入 请求体解析 依赖包
import bodyParser from "koa-bodyparser";
// 导入 同步数据库 函数
import { syncDB } from "./db/index.js";
// 跨域 依赖包
import cors from "@koa/cors";
// 导入 老师 模型
import { Teacher } from "./modle/Teacher.js";

// 同步数据库
syncDB();

// 创建 koa 实例
const app = new koa();

// 创建 路由 实例
const router = new Router();

// 使用 跨域 中间件 解决跨域问题
app.use(
  cors({
    // 允许的前端域名和端口
    origin: "http://localhost:5500",
    // 允许的 HTTP 方法
    methods: ["GET", "POST", "PUT", "DELETE"],
    // 允许的请求头
    allowedHeaders: ["Content-Type", "Authorization"],
  })
);

// 使用中间件注册路由
app.use(async (ctx, next) => {
  // 请求的路径
  // console.log(ctx.url);

  // 执行下一个中间件
  await next();
});

// 请求体解析
app.use(bodyParser());

/* 查询所有老师信息 */
router.get("/teachers", async (ctx, next) => {
  // 响应信息
  let res;

  // 查询所有老师信息
  const teachers = await Teacher.findAll();

  // 判断是否查询到老师信息列表
  if (teachers) {
    // 如果列表有老师
    if (teachers.length > 0) {
      // 查询成功
      res = {
        code: 200,
        message: "查询成功",
        data: teachers,
      };
    }
    // 如果列表为空
    else {
      // 暂无数据
      res = {
        code: 200,
        message: "暂无数据",
        data: null,
      };
    }
  } else {
    // 查询异常
    res = {
      code: 500,
      message: "查询异常",
      data: null,
    };
  }

  // 响应状态码
  ctx.status = 200;

  // 响应 Json 数据
  ctx.body = res;

  // 执行下一个中间件
  await next();
});

/* 查询指定 id 的老师 */
router.get("/teachers/:id", async (ctx, next) => {
  // 响应信息
  let res;

  // 拿到 请求id
  const id = parseInt(ctx.params.id.replace(":", "")) || 0;

  // 查询所有老师信息
  const teacher = await Teacher.findByPk(id);

  // 如果有查询到老师信息
  if (teacher) {
    // 查询成功
    res = {
      code: 200,
      message: "查询成功",
      data: teacher,
    };
  } else {
    // 查无此人
    res = {
      code: 500,
      message: "老师不存在",
      data: null,
    };
  }
  // 响应状态码
  ctx.status = 200;

  // 响应 Json 数据
  ctx.body = res;

  // 执行下一个中间件
  await next();
});

/* 新增老师 */
router.post("/teachers", async (ctx, next) => {
  // 响应信息
  let res;

  // 拿到请求对象
  const obj = ctx.request.body;

  // 新增老师
  const isOk = await Teacher.create(obj);

  // 判断是否新增成功
  if (isOk) {
    // 新增成功
    res = {
      code: 200,
      message: "新增成功",
      data: null,
    };
  } else {
    // 新增失败
    res = {
      code: 500,
      message: "新增失败",
      data: null,
    };
  }

  // 响应状态码
  ctx.status = 200;

  // 响应 Json 数据
  ctx.body = res;

  // 执行下一个中间件
  await next();
});

/* 修改老师 */
router.put("/teachers/:id", async (ctx, next) => {
  // 响应信息
  let res;

  // 拿到 请求id
  const id = parseInt(ctx.params.id.replace(":", "")) || 0;

  // 拿到请求对象
  const obj = ctx.request.body;

  // 老师是否存在
  const isOk = await Teacher.findByPk(id);

  // 判断指定 id 的老师是否存在
  if (isOk) {
    // 老师存在，可以修改老师
    const updateIsOk = await Teacher.update(obj, { where: { id } });

    // 判断是否修改成功
    if (updateIsOk) {
      // 修改成功
      res = {
        code: 200,
        message: "修改成功",
        data: null,
      };
    } else {
      // 修改失败
      res = {
        code: 500,
        message: "修改失败",
        data: null,
      };
    }
  } else {
    // 老师不存在,修改失败
    res = {
      code: 500,
      message: "老师不存在,修改失败",
      data: null,
    };
  }

  // 响应状态码
  ctx.status = 200;

  // 响应 Json 数据
  ctx.body = res;

  // 执行下一个中间件
  await next();
});

/* 删除指定 id 的老师 */
router.delete("/teachers/:id", async (ctx, next) => {
  // 响应信息
  let res;

  // 拿到 请求id
  const id = parseInt(ctx.params.id.replace(":", "")) || 0;

  // 老师是否存在
  const teacher = await Teacher.findByPk(id);

  // 判断指定 id 的老师是否存在
  if (teacher) {
    // 老师存在,可以删除老师
    const isOk = await Teacher.destroy({ where: { id } });

    // 判断是否删除成功
    if (isOk) {
      // 删除成功
      res = {
        code: 200,
        message: "删除成功",
        data: null,
      };
    } else {
      // 删除失败
      res = {
        code: 500,
        message: "删除失败",
        data: null,
      };
    }
  } else {
    // 老师不存在，不能删除
    res = {
      code: 500,
      message: "老师不存在，不能删除",
      data: null,
    };
  }

  // 响应状态码
  ctx.status = 200;

  // 响应 Json 数据
  ctx.body = res;

  // 执行下一个中间件
  await next();
});

// 使用中间件
app.use(router.routes());

// 监听服务器端口
app.listen(appPort);

// 当前服务器运行地址
console.log(`当前服务器运行地址：http://localhost:${appPort}`);
